/* 基准性能测试
样例输出
0.405465
0.000850702
-0.000122093
356ms
-0.000122093
234ms

qt需要用QVector<double>，因为只有QVector提供了数组指针
使用QVector<>::data()获取数组指针，使用QVector<>::count()获取数组元素个数
例如有参数QVector<double> x，则可以用如下方法：
double r;
// 计算r的值
entropys::FastSampleEntropy(x.data(), x.count(), r, 2);
如果m取值为2的话，使用entropys::FastSampleEntropy_m2(x.data(), x.count(), r);更好
注意：函数内部不进行参数正确性的检查，请务必在调用前检查
不要使用任何除QVector以外的容器，这些容器普遍性能较差且不提供指针
对于其他情况，可以使用std::vector<double>，因为该容器也提供了指针
否则请直接使用double*类型，然后new一个数组，或者自行实现一个线性表容器类
使用编译器-O2及以上的优化等级可以大幅度提高性能
使用FastSampleEntropy_ai更快，使用ChatGPT优化加手工调整
*/

#include "sampleentropy.h"
#include <time.h>
#include <iostream>

int main()
{
    double x[] = { 1,1,1,1,9 };
    std::cout << entropys::SampleEntropy(x, 5, 1.5, 2) << "\n"; // must output 0.405465

    // https://blog.csdn.net/Cratial/article/details/79742363
    double xx[51];
    for (int i = 0; i < 17; i++) {
        xx[i * 3] = 85;
        xx[i * 3 + 1] = 80;
        xx[i * 3 + 2] = 89;
    }
    std::cout << entropys::FastSampleEntropy(xx, 51, 3, 2) << "\n"; // must output 0.000850702
    std::cout << entropys::FastSampleEntropy_ai(xx, 51, 3, 2) << "\n";
    std::cout << entropys::FastSampleEntropy_m2(xx, 51, 3) << "\n"; // must output 0.000850702

    double x2[8192];
    for (int i = 0; i < 8192; i++)
        x2[i] = i;

    clock_t t = clock();
    std::cout << entropys::SampleEntropy(x2, 8192, 1.5, 2) << "\n"; // must output -0.000122093
    t = clock() - t;
    std::cout << t << "ms\n";

    // 以下代码的时间应该在上面的2/3左右
    t = clock();
    std::cout << entropys::FastSampleEntropy(x2, 8192, 1.5, 2) << "\n"; // must output -0.000122093
    t = clock() - t;
    std::cout << t << "ms\n";

    t = clock();
    std::cout << entropys::FastSampleEntropy_ai(x2, 8192, 1.5, 2) << "\n"; // must output -0.000122093
    t = clock() - t;
    std::cout << t << "ms\n";

    t = clock();
    std::cout << entropys::FastSampleEntropy_m2(x2, 8192, 1.5) << "\n"; // must output -0.000122093
    t = clock() - t;
    std::cout << t << "ms\n";
}
